package service

import (
	"fmt"
	"github.com/afex/hystrix-go/hystrix"
)

type Hystrix struct{}

func (h *Hystrix) Do(run func() error) error {
	err := hystrix.Do("default", run, func(err error) error {
		fmt.Println(err)
		return err
	})
	if err != nil {
		return err
	}

	return nil
}

func (h *Hystrix) Go(run func() error) {
	hystrix.Go("default", run, func(err error) error {
		fmt.Println(err)
		return err
	})
}

func NewHystrix() Interface {
	h := &Hystrix{}

	hystrix.ConfigureCommand("default", hystrix.CommandConfig{
		Timeout:                1000, // 超时时间1秒
		MaxConcurrentRequests:  20,   // 最大并发数量20
		SleepWindow:            1000, // 窗口时间1秒，熔断开启1秒后尝试重试
		RequestVolumeThreshold: 5,    // 10秒钟请求数量超过5次，启动熔断器判断
		ErrorPercentThreshold:  50,   // 请求数超过5并且错误率达到百分之50，开启熔断
	})

	return h
}
